/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Fernanda
 */
public class CmdDoWhile {

     cmd cmd = new cmd();


    public boolean sintaxeCmdDoWhile(TabelaSimbolos tabelasimbolos){
        System.out.println("IMPRIME " + tabelasimbolos.getLookahead());
        tabelasimbolos.insertEscopo();
        if(tabelasimbolos.reconhecer("do")){
            System.out.println(" reconheceu do");
            if (tabelasimbolos.getLookahead().equals("{")) {
                System.out.println(" reconheceu {");
                if (tabelasimbolos.reconhecer("{")) {
                    while (verificaInicio(tabelasimbolos)) {
                        if (cmd.sintaxeCmd(tabelasimbolos)) {
                            continue;
                        }
                    }
                    if (tabelasimbolos.reconhecer("}"))//permite {} sem comando dentro
                    {
                        System.out.println(" reconheceu }");
                    } else {

                         ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " } esperado");
                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false; //se nao achar }
                    }

                }
            } else if (verificaInicio(tabelasimbolos)) {

                //quando o while só tem um comando (nao tem chaves)
                if (cmd.sintaxeCmd(tabelasimbolos)) {
                } else {

                         ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " } esperado");
                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false; //se nao achar }
                    }

            }
            else {

                         ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " ou nao existe { ou nao existe o inicio de um comando");
                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false; //se nao achar }
                    }
                    
            

            if (tabelasimbolos.reconhecer("while") && tabelasimbolos.reconhecer("(") && verificaExpOrBool(tabelasimbolos)
                    && tabelasimbolos.reconhecer(")") && tabelasimbolos.reconhecer(";"))
                return true;
            else{
                  ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " nao achou a cadeia while (exp|boolean);");
                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false; //se nao achar }
            }

        }
        else{

                              ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " Não encontrou o do");
                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false; //se nao achar }
        }
            

    }




    /**
     * Verifica se há comando(s) dentro do while
     * @param tabelasimbolos
     * @return true, se há comando dentro do while
     */
    public boolean verificaInicio(TabelaSimbolos tabelasimbolos) {
        if (tabelasimbolos.getTipo().equals("identificador") || tabelasimbolos.getLookahead().equals("*") ||
                tabelasimbolos.getLookahead().equals("scanf") || tabelasimbolos.getLookahead().equals("printf") ||
                tabelasimbolos.getLookahead().equals("if") || tabelasimbolos.getLookahead().equals("while") ||
                tabelasimbolos.getLookahead().equals("do") || tabelasimbolos.getLookahead().equals("for")) {
            return true;
        }

        return false;
    }

        public boolean verificaExpOrBool(TabelaSimbolos tabelasimbolos){

        if(verificaExpLogica(tabelasimbolos)){
            if(ExpressaoLogica.expLogica(tabelasimbolos) ){
                return true;
        }
            else{
                System.out.println(" Expressao logica mal formada");
                return false;//expLogica mal formada
            }
                
        }

        else if(tabelasimbolos.getLookahead().equals("true")
                ||tabelasimbolos.getLookahead().equals("false")){
            System.out.println(" Foi um boolean ");
            tabelasimbolos.soConsome();
            return true;
        }
        else
            return false; //sintaxe errada, se nao existir expLogica ou um boolean
    }

        public boolean verificaExpLogica(TabelaSimbolos tabelaSimbolos) {

        if (tabelaSimbolos.getTipo().equals("identificador") || tabelaSimbolos.getTipo().equals("numero") ||
                tabelaSimbolos.getLookahead().equals("(")) {
            return true;
        } else {
            System.out.println(" nao eh nem identificador, nem numero , nem (");
            return false;
        }
        }
}
